/**
主要回顾：异常

异常体系：
--------| Throwable
------------| Error    ：一般由于 JVM 或者硬件导致，一般不会通过代码处理。
------------| Exception：一般通过代码处理
----------------| 运行时异常  ：未处理，编译不报错
----------------| 非运行时异常：未处理，编译报错


Throwable 常用方法：
    toString();        //返回当前异常对象的完整类名
    getMessage();      //返回创建 Throwable 传入的字符串信息
    printStackTrace(); //追踪输出至标准错误流
    
    
异常处理：
    1.捕获处理
        try{
            可能发生异常的代码
            一般代码（发生异常时些处不执行）
        }catch(捕获异常类型 变量名){
            处理异常的代码
        }finally{
            
        }
        
    
    2.抛出处理
        方法 throws Exception{
            代码
            throw new Exception
        }
        
自定义异常：继承异常类即可
*/

class MyEception extends Exception{
    MyEception(){    //无参构造函数
        
    }
    
    MyEception(String message){    //带 String 参数构造函数
        super(message);
    }
}

class LearnException {
    public static void main(String[] args) throws Exception{
        //演示除 0 异常
        div(4, 0);
        
        //演示空指针异常
//        int[] arr = null;
//        count(arr);        
        
        //演示自定义异常
        try {
            my("ME");
        } catch (MyEception e) {
            e.printStackTrace();
        }
    }
    
    public static void div(int a, int b){
        int c = 0;
        try {
            c = a / b;
        } catch (Exception e) {
            System.out.println("toString " + e.toString());
        } finally {
            System.out.println("div running...");
        }
        System.out.println("c = " + c);
    }
    
    public static void count(int[] arr) throws Exception{
        if (arr == null) {
            throw new Exception();
        }
        System.out.println(arr.length);
        System.out.println("count running...");
    }
    
    public static void my(String me) throws MyEception{
        if (me.equals("ME")) {
            throw new MyEception("ME");
        }
        System.out.println(me);
    }
    
}